package com.beiding.jsonanalyzer.analyze.func.base;

import com.beiding.jsonanalyzer.analyze.func.FuncBase;
import com.beiding.jsonanalyzer.flow.ValueNode;

/**
 * 多key聚合函数
 *
 * 可用来处理IF,Switch,Concat等具有多个表达式的函数结构
 *
 * @author 丁常磊
 * @date 2022/6/10 10:09
 */

public abstract class MultiValueFunc implements FuncBase {

    /**
     * 位置是重要的
     */
    protected FuncBase[] gets;

    /**
     * 配置取值
     *
     * @param gets
     */
    public void config(FuncBase[] gets) {
        this.gets = gets;
    }

    @Override
    public boolean checkAgg() {
        //检查聚合,有任何一个是聚合的就返回聚合
        for (FuncBase get : gets) {
            if (get.checkAgg()) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void pugAgg(ValueNode valueNode) {

        //对每个都放入聚合
        for (FuncBase get : gets) {
            get.pugAgg(valueNode);
        }

    }

    @Override
    public void resetAgg() {
        for (FuncBase get : gets) {
            get.resetAgg();
        }
    }

    @Override
    public Object executeOne(ValueNode valueNode) {
        Object[] vs = new Object[gets.length];

        for (int i = 0; i < gets.length; i++) {
            vs[i] = gets[i].executeOne(valueNode);
        }

        return forMultiValues(vs);
    }

    @Override
    public Object aggGet() {
        Object[] vs = new Object[gets.length];

        for (int i = 0; i < gets.length; i++) {
            vs[i] = gets[i].aggGet();
        }

        return forMultiValues(vs);
    }

    protected abstract Object forMultiValues(Object[] values);

}
